
/* Zur besseren Orientierung hier der Inhalt der Datei:
 * 
 * Abschnitt A:  Funktionen für PopUp Fenster
 * Abschnitt B:  Funktionen rund um Login/Logout
 * Abschnitt C:  Funktionen für die Liste der Fahrten
 * Abschnitt D:  Funktionen für das Formular zum Hinzufügen einer Fahrt
 * Abschnitt E:  Funktionen für das Formular zum Anlegen eines Users
 * Abschnitt F:  Funktionen zum Mitfahren bei einer Route 
 * Abschnitt G:  Funktionen zum anzeigen alle Fahrten und Mitfahrten eines Users
 */


//---------------------------------------------------------------------------------------
//  Abschnitt A  |  Funktionen für PopUp Fenster (26.04.2012)
//---------------------------------------------------------------------------------------
	
	// Quelle (=zum Teil geklaut von): http://yensdesign.com/2008/09/how-to-create-a-stunning-and-smooth-popup-using-jquery/
	//centering popup
	function centerPopUp(divID, maxwidth){
		var windowWidth = window.outerWidth;
				
		//erst einmal max. breite setzten
		if (window.outerWidth < 450)
			maxwidth = window.outerWidth-50;
		
		$('#'+divID).css({
			"max-width": maxwidth
		});
		
		//dann schauen, wie breit das Popup tatsächlich ist
		var popupWidth = $('#'+divID).width();
			
		//und popup zentrieren
		$('#'+divID).css({
			"position": "absolute",
			"top": 200,
			"left": windowWidth/2-popupWidth/2,
		});
	}
	
	//loading popup with jQuery magic!
	function loadPopUp(divID, maxwidth){
		if (typeof maxwidth === 'undefined')
			var maxwidth = 400;
		
		//Markus: Während ein Popup angezeigt wird, werden alle anderen Formulare deaktiviert
		//Ausgeschlossen sind Formulare innerhalb des PopUps
		$('form').attr("disabled", "true");
		$('form', '#'+divID).removeAttr("disabled");
		
		centerPopUp(divID, maxwidth);
		$("#backgroundPopup").css({
			"opacity": "0.7"
		});
		$("#backgroundPopup").fadeIn("slow");
		$('#'+divID).fadeIn("slow");
	}
	
	//disabling all popups with jQuery magic!
	function disablePopup(){
		$("#backgroundPopup").fadeOut("slow");
		//Alle DIVs ausblende, welche die class = isPopUp haben
		$("div.isPopUp").fadeOut("slow", function() {
			//Markus: Nachdem das Popup weg ist, darf der Anwender wieder klicken			
			$("form").removeAttr("disabled");
		});
	}
	
	//(Ab hier wieder von uns) 
	/* Diese Funktion wird immer aufgerufen, wenn ein AJAX Aufruf einen Fehler
	   zurück gibt.
	   Folgende Fälle können auftreten:
	    - Code=LoginRequired --> Login-Fenster wird angezeigt
		- Code=Etwas anderes --> PopUp mit Meldung wird angezeigt
	*/
	function DoOnFailureReturned(Code, Message){
		
		$('div#MessageHeader').removeClass();
		$('div#MessageFooter').removeClass();
		
		switch (Code) {
		case 'LoginRequired':
			showLoginOrLogout(false);
			$('div#MessageHeader').text('Bitte anmelden');
			$('div#LoginMessage').html('<p>'+Message+'<p>');
			//Über class wird die Hintergrundfarbe festgelegt. siehe css
			if (Message != "") {
				$('div#MessageHeader').addClass('warning');
				$('div#MessageFooter').addClass('warning');
			} else {
				$('div#MessageHeader').addClass('information');
				$('div#MessageFooter').addClass('information');
			}
			
			loadPopUp('LoginWindow');
			break;
		case 'ErrorMessage':
			$('div#MessageHeader').text('Fehler');
			$('div#MessageMain').text(Message);
			//Über class wird die Hintergrundfarbe festgelegt. siehe css
			$('div#MessageHeader').addClass('error');
			$('div#MessageFooter').addClass('error');
			loadPopUp('MessageWindow');
			break; 
		case 'WarningMessage':
			$('div#MessageHeader').text('Bitte aufpassen');
			$('div#MessageMain').text(Message);
			$('div#MessageHeader').addClass('warning');
			$('div#MessageFooter').addClass('warning');
			loadPopUp('MessageWindow');
			break;
		case 'InfoMessage':
			$('div#MessageHeader').text('Information');
			$('div#MessageMain').text(Message);
			$('div#MessageHeader').addClass('information');
			$('div#MessageFooter').addClass('information');
			loadPopUp('MessageWindow');
			break;
		default:
			$('div#MessageHeader').text('Es tut uns leid.');
			$('div#MessageMain').text(Message);
			$('div#MessageHeader').addClass('error');
			$('div#MessageFooter').addClass('error');			
			loadPopUp('MessageWindow');
			break;
		}
	}

	function divsAnordnen(activeDiv) {
		/*Die Größe des Div wird immer auf die sichtbare(!) Größe des Browsers angepasst.
		Somit muss man immer nur nach unten scrollen und nie nach rechts/links.
		Außerdem werden die Divs zentriert und das Menü auf deren Breite angepasst.*/

		var windowWidth = window.innerWidth;				
		var maxWidth = windowWidth - 40; 

		$('div.content').css({
			"max-width": maxWidth
		});
		
		/* über activeDiv kann man den Namen des Divs übergeben, welches angezeigt wird und
		   nach welchem alles ausgerichtet werden soll. Wenn activeDiv nicht übergeben wird, dann
		   wird das aktuell sichtbare Div verwendet.*/
		var contentWidth;
		if (typeof activeDiv === 'undefined')
			contentWidth = $('div.content:visible').width();
		else
			contentWidth = $('div#'+activeDiv).width();
			
					
		//Menü und Content zentrieren
		$('#menucontainer').css({
			"position": "absolute",
			"width": contentWidth,
			"left": windowWidth/2-contentWidth/2
		});
						
		$('div.content').css({
			"position": "absolute",
			"left": windowWidth/2-contentWidth/2,
			"top": $('#menucontainer').height() + 22
		});
	}

//---------------------------------------------------------------------------------------
//  Abschnitt B  |  Funktionen rund um Login/Logout
//---------------------------------------------------------------------------------------
	
	/** isLogin=true : Logout wird angezeigt
	 *  islogin=false: Login wird angezeigt
	 */
	function showLoginOrLogout(isLogin) {
		if (isLogin) {
			$('div#menuLogin').hide();
			$('div#menuNeuUser').hide();
			$('div#menuLogout').show();
		} else {
			$('div#menuLogin').show();
			$('div#menuNeuUser').show();
			$('div#menuLogout').hide();
		}
	}
	
	/*Sende eine einfache Anfrage an den Server. Der Server prüft, ob der aktuelle Sitzungs-Cookie noch 
	 * gültig ist bzw. ob überhaupt ein Sitzungs-Cookie angeleg ist.
	 * Wenn gültig, dann wird im Menü Logout angezeigt. Sonst Login.*/
	function CheckIsLoggedIn() {
		$.ajax({
             type: "POST",
             url: "checkSession.json",
             cache: false,
             success: function(answer){
				//answer ist immer ein Objekt vom Typ AJAXMessages. Siehe Servlet
            	//Nur isOk wird ausgewertet. Es wird keine Fehlermeldung ausgegeben.
				showLoginOrLogout(answer.isOk);
             },
			error: function(xhr, textStatus, errorThrown) { 
				DoOnFailureReturned('Sorry', "Es besteht keine Verbindung zum Server. Bitte versuchen Sie es später erneut."); 
			}
		});
	}
	function Logout() {
		$.ajax({
            type: "POST",
            url: "logout.json",
            cache: false,
            success: function(answer){	//answer ist immer ein Objekt vom Typ AJAXMessages. Siehe Servlet
            	//logout.json liefert immer isOk=true zurück. Die Fehlerprüfung ist nur Pro-Forma
        		if (!answer.isOk){
					DoOnFailureReturned(answer.returnCode, answer.returnMessage); 
				} else {
					showLoginOrLogout(false);
				}
             },
			error: function(xhr, textStatus, errorThrown) { 
				DoOnFailureReturned('Sorry', "Es besteht keine Verbindung zum Server. Bitte versuchen Sie es später erneut."); 
			}
		});
	}

	/*Klick auf "Einloggen"*/
	function onSubmit_loginForm() {
		var submitButton = $('#loginForm').find("input[type='submit']");
	    var btnText = $(submitButton).attr("value");
	    submitButton.attr("value", "Bitte warten...");
	    submitButton.attr("disabled", "true");
	    showLoginOrLogout(false);
		
	    $.ajax({
	        type: "POST",
	        url: "login.json",
	        cache: false,
	        data: $('#loginForm').serialize(),
	        success: function(answer){
				//answer ist immer ein Objekt vom Typ AJAXMessages. Siehe Servlet
				
				if (!answer.isOk){
					DoOnFailureReturned(answer.returnCode, answer.returnMessage); 
				} else {
					disablePopup();
					showLoginOrLogout(true);
				}
	        },
			error: function(xhr, textStatus, errorThrown) {
				DoOnFailureReturned('Sorry', "Es besteht keine Verbindung zum Server. Bitte versuchen Sie es später erneut."); 
			},
	        complete: function(jqXHR, textStatus) {
	        	submitButton.attr("value", btnText);
	        	submitButton.removeAttr("disabled");
	        	divsAnordnen();
	        }

	    });
	}



//---------------------------------------------------------------------------------------
//  Abschnitt C  |  Funktionen für die Liste der Fahrten
//---------------------------------------------------------------------------------------
	
	/*Löschen der Liste: 
		1. Es werden alle Elemente mit einer netten Animation ausgeblendet
		2. Nachdem die Animation zum Ausblenden fertig ist, wird this.remove aufgerufen, damit
		das Element auch gelöscht wird.*/
	function ClearFahrtenListe (){
		$('div#main_suche div.zeile').each(function() {   //= Schleife über alle Div-Elemente mit class=zeile
			if ($(this).attr('id') != 'zeile_blanko' 
				&& $(this).attr('id') != 'zeile_headline') //Blanko-Zeile und Überschrift dürfen nicht gelöscht werden
			{
				$(this).fadeOut(500, function(){$(this).remove();});//Zeile mit netter Animation ausblenden
			}
		});
	}

	/*Neue Zeile hinzufügen:
		Dieser Funktion wird ein "Datensatz" als JSON Objekt übergeben. Wenn man isOben=true übergibt, wird die
		Zeile oben angefügt. Sonst unten am Ende der Liste.
		
	  Zur Programmierung:
		Alle Zeilen befinden sich in dem Div "main". Main ist mehr oder weniger der Container für die Zeilen.
		Die erste Zeile in Main ist die Überschrift. Danach kommt die Blanko-Zeile (siehe HTML Quelltext).
		AddLine fügt dann folgendermasen eine neue Zeile zu main:
		1. Kopie der Blanko-Zeile erstellen
		2. ID der Kopie ändern (BTW: über die ID kann jedes Element einer HTML Seite mit JavaScript wiedergefunden 
			und verändert werden). 
		3. Zeile entweder nach der Überschrift oder ganz am Ende von main einfügen. 
		   Weil die Blanko-Zeile angeblendet ist, ist die neue Zeile auch erst einmal ausgeblenet
		4. Spalten mit Werten ausfüllen.
		5. Zeile mit einem schönen Effekt einblenden.*/ 
	function AddLineToFahrtenListe (json, isOben) {
		$('div#zeile_blanko').hide(); //Zeile "Keine Fahrt gefunden" ausblenden

		//var json = $.parseJSON(LineJsonString);
		
		var lineId = 'zeile' + json.id;
		var myNewLine = $('div#zeile_blanko').clone();
		myNewLine.attr('id', lineId);
		myNewLine.addClass('zeile_clickable'); //Die CSS Klasse "zeile_clickable" bewirkt, dass sich der Hintergrund ändert
		myNewLine.click(ShowMitfahrenWindow); //Bedeutet, dass die Funktion ShowMitfahrenWindow aufgerufen wird, wenn man auf eine Zeile klickt
		
		if (isOben) {
			$('#zeile_headline').after(myNewLine);
		} else {
			$('#main_suche').append(myNewLine);
		}
		
		$('div#'+lineId + ' div.col1').text(json.zeit);
		$('div#'+lineId + ' div.col2').text(json.fahrer);
		$('div#'+lineId + ' div.col3').text(json.platz);
		$('div#'+lineId + ' div.col4').text('');
							
		for (var i = 0; i < json.orte_kurz.length; i++) {  //Schleife �ber alle Orte im JSON-Objekt
			var myNewOrt = $('div#ort_blanko').clone(); //F�r den Pfeil, in dem der Ort steht gibt es eine Vorlage, welche einfach kopiert wird. Die Vorlage ist ausgeblendet.
			myNewOrt.removeAttr('id'); //eindeutige ID aus der Kopie l�schen.
			myNewOrt.css('visibility',  'visible');
			if (json.orte_kurz[i].highlight) {
				myNewOrt.find('td#ort_platzhalter').html('<b>'+json.orte_kurz[i].name+'<b>');
			} else {
				myNewOrt.find('td#ort_platzhalter').html(json.orte_kurz[i].name);
			}
			$('div#'+lineId + ' div.col4').append(myNewOrt);
			$('div#'+lineId + ' div.col4').append(' '); //Leerzeichen einf�gen, damit Platz zwischen den Orten ist
		}
		
		//delay(510) wartet kurz, bis die alten zeilen gelöscht wurden. Das macht die Animations schöner
		myNewLine.delay(500).fadeIn(500); //nette Animation

	};
	
	/*Klick auf Suchen*/
	function onSubmit_SearchForm() {
		
		
		var submitButton = $('#SearchForm').find("input[type='submit']");
		var btnText = $(submitButton).attr("value");
		submitButton.attr("value", "Bitte warten...");
		submitButton.attr("disabled", "true");
		
		ClearFahrtenListe();
		/*Suchkriterien bis zur nächsten Suche zwischenspeichern
         * Bedeutung der Felder letztesuche_xxx: Beim klick auf Suchen werden die Orte, nachdenen gesucht werden, in diesen
         * Felder gespeichert. Ändert ein User die Suchfelder ab, klickt aber dann nicht auf Suchen, sondern auf
         * Mitfahren, dann weiß die Mitfahren-Funktion immer noch, für welche Felder die Suchergebnisse waren.*/
		$('[name="letztesuche_von"]', 'form#SearchForm').val($('[name="von"]', 'form#SearchForm').val());
	    $('[name="letztesuche_nach"]', 'form#SearchForm').val($('[name="nach"]', 'form#SearchForm').val());
	    
	    $.ajax({
	        type: "POST",
	        url: "sucheRoute.json",
	        cache: false,
	        data: { von: $('[name="von"]', 'form#SearchForm').val(),
	        		nach: $('[name="nach"]', 'form#SearchForm').val(),
	        		tag: $('[name="tag"]', 'form#SearchForm').val()},
	        success: function(answer){
				//answer ist immer ein Objekt vom Typ AJAXMessages. Siehe Servlet
				
				if (!answer.isOk){
					DoOnFailureReturned(answer.returnCode, answer.returnMessage); 
				} else {
					/*Ist die Suche erfolgreich, dann liefert sie als Ergebis
					  ein Array von RouteListe-Objekten (das Array ist in 
					  returnMessage abgelegt)*/
					ClearFahrtenListe();
					{/*warten*/ }
					if (answer.returnMessage.length == 0) {
						$("#zeile_blanko").delay(500).fadeIn(500);	
					} else {
						for (var i = 0; i < answer.returnMessage.length; i++) {
							AddLineToFahrtenListe(answer.returnMessage[i], false);
						}
					}
				}
	        },
			error: function(xhr, textStatus, errorThrown) {
				DoOnFailureReturned('Sorry', "Es besteht keine Verbindung zum Server. Bitte versuchen Sie es später erneut."); 
			},
		    complete: function(jqXHR, textStatus) {
		    	submitButton.attr("value", btnText);
		    	submitButton.removeAttr("disabled");
		    	divsAnordnen();
		    }
		});
	}

//---------------------------------------------------------------------------------------
//  Abschnitt D  |  Funktionen für das Formular zum Hinzufügen einer Fahrt
//---------------------------------------------------------------------------------------
	
	/*Jedes Mal, wenn man einen Buchstaben in das Feld "Über..." eingibt, wird geprüft ob ggf.
	 * eine neue Zeile für einen Zwischenhalt eingeüft werden muss. */
	function onKey_NeuForm_Ueber() {
		var divOfLastUber = $('div.ueber:last');
		
		if (divOfLastUber.find('input').val() != "")
			AddFieldto_NeuForm();	
	}

	function onChange_NeuForm_Ueber(refid) {
		var inputfield = $("input#[name="+refid.name+"]");
		var divBlock = inputfield.parent().parent();
		
		if (inputfield.val() == '' &&
			$('div.ueber:last').attr('id') != divBlock.attr('id'))
				divBlock.remove();
	}

	var globalMaxNeuForm_UeberId=0;  //Globale Variable
	function AddFieldto_NeuForm() {
		globalMaxNeuForm_UeberId++;
		var myNewField = $('div#ueber_div_blanko').clone();
		myNewField.attr('id', 'ueber_div'+ globalMaxNeuForm_UeberId);
		myNewField.css('visibility','visible');
		myNewField.show();
		myNewField.find('input').val('');
		//Der Effekt bei focusin und focusout wird leider nicht mitkopiert
		myNewField.find('input').focusin(function() {	$(this).addClass("highlight"); }); 
		myNewField.find('input').focusout(function() {$('input').removeClass("highlight"); 	});
		myNewField.find('input').attr('name', 'ueber_' + globalMaxNeuForm_UeberId);
		$('#addNewFieldHere').before(myNewField);
		myNewField.fadeIn(100);
	}
	
	/*Formularfelder leeren und alle Zwischenhalte (bis auf einen) entfernen*/
	function ClearNeuForm() {
		globalMaxNeuForm_UeberId = 0;
		$('div.ueber').each(function() { 
			if ($(this).attr('id') != 'ueber_div_blanko')
				$(this).remove();
		});
		
		$('input', 'form#newForm').each(function() {
			if ($(this).attr('type') != 'submit')
				$(this).val('');
		});
		

		$('div#ueber_div_blanko').hide();
		AddFieldto_NeuForm();
	}
	
	/*Klick auf Speichern*/
	function onSubmit_newForm () {
		var submitButton = $('#newForm').find("input[type='submit']");
		var btnText = $(submitButton).attr("value");
		submitButton.attr("value", "Bitte warten...");
		submitButton.attr("disabled", "true");
		
		
		$.ajax({
		    type: "POST",
		    url: "saveRoute.json",
		    cache: false,
		    data: $('#newForm').serialize(),
		    success: function(answer){
				//answer ist immer ein Objekt vom Typ AJAXMessages. Siehe Servlet
				
				if (!answer.isOk){
					DoOnFailureReturned(answer.returnCode, answer.returnMessage); 
				} else {
					DoOnFailureReturned(answer.returnCode, answer.returnMessage);
					ClearNeuForm();
				}
		    },
			error: function(xhr, textStatus, errorThrown) {
				DoOnFailureReturned('Sorry', "Es besteht keine Verbindung zum Server. Bitte versuchen Sie es später erneut."); 
			},
		    complete: function(jqXHR, textStatus) {
		    	submitButton.attr("value", btnText);
		    	submitButton.removeAttr("disabled");
		    }
		
		});
	}
	
	
	
//---------------------------------------------------------------------------------------
//  Abschnitt E  |  Funktionen für das Formular zum Anlegen eines Users
//---------------------------------------------------------------------------------------
	
	//KK Anfang 
	function ClearNeuUserForm() {
		$('input', 'form#newUserForm').each(function() {
			if ($(this).attr('type') != 'submit')
				$(this).val('');
		});
	}
	
	function onSubmit_newUserForm(){
		var submitButton = $('form#newUserForm').find("input[type='submit']");
		var btnText = $(submitButton).attr("value");
		submitButton.attr("value", "Bitte warten...");
		submitButton.attr("disabled", "true");
		
		$.ajax({
		    type: "POST",
		    url: "saveUser.json",
		    cache: false,
		    data: $('#newUserForm').serialize(),
		    success: function(answer){
				//answer ist immer ein Objekt vom Typ AJAXMessages. Siehe Servlet
				
				if (!answer.isOk){
					DoOnFailureReturned(answer.returnCode, answer.returnMessage); 
				} else {
					DoOnFailureReturned(answer.returnCode, answer.returnMessage);
					ClearNeuUserForm();
				}
		    },
			error: function(xhr, textStatus, errorThrown) {
				DoOnFailureReturned('Sorry', "Es besteht keine Verbindung zum Server. Bitte versuchen Sie es später erneut."); 
			},
		    complete: function(jqXHR, textStatus) {
		    	submitButton.attr("value", btnText);
		    	submitButton.removeAttr("disabled");
		    }
		
		});
	}
	
	//KK Ende
	
	
//---------------------------------------------------------------------------------------
//  Abschnitt F  |  Funktionen zum Mitfahren bei einer Route 
//---------------------------------------------------------------------------------------

	//Fenster zum Mitfahren bei einer Route anzeigen
	function ShowMitfahrenWindow(event) {
		var zeile = event.currentTarget; //Über currentTarget bekommt man das HTML Element, auf das geklickt wurde. Also die Zeile 
		var tmpid = $(zeile).attr('id'); //Bsp id: "zeile1", "zeile3", ... Also Zeile+RoutenID
		tmpid = tmpid.substr(5); //ID extrahieren

		$.ajax({
             type: "POST",
             url: "getRoute.json",
             cache: false,
             data: {id: tmpid},
             success: function(answer){
					//answer ist immer ein Objekt vom Typ AJAXMessages. Siehe Servlet
					if (!answer.isOk){
						DoOnFailureReturned(answer.returnCode, answer.returnMessage); 
					} else {
						$('div#Join_ID').text(answer.returnMessage.id);
						$('div#Join_Fahrer').text(answer.returnMessage.fahrer);
						$('div#Join_Abfahrt').text(answer.returnMessage.zeit);
						$('div#Join_Ankunft').text(answer.returnMessage.anzeit);
						$('div#Join_OrteListe').text('');
						for (var i = 0; i < answer.returnMessage.orte_lang.length; i++) {  //Schleife über alle Orte im JSON-Objekt
							var myNewOrt = $('div#ort_blanko').clone(); //Für den Pfeil, in dem der Ort steht gibt es eine Vorlage, welche einfach kopiert wird. Die Vorlage ist ausgeblendet.
							myNewOrt.removeAttr('id'); //eindeutige ID aus der Kopie löschen.
							myNewOrt.css('visibility',  'visible');
							/* Die Orte werden mit A) B) C) usw. durchnummeriert.
							 * A ist ASCII Code 65. String.fromCharCode() wandelt dann den Code in einen Buchstaben um. */
							myNewOrt.find('td#ort_platzhalter').html(String.fromCharCode(65+i) + ') ' + answer.returnMessage.orte_lang[i].name);
							$('div#Join_OrteListe').append(myNewOrt);
							$('div#Join_OrteListe').append(' '); //Leerzeichen einf�gen, damit Platz zwischen den Orten ist
						}
						
						$('div#MessageHeader').text('Mitfahrern?');
						//Über class wird die Hintergrundfarbe festgelegt. siehe css
						$('div#MessageHeader').addClass('information');
						$('div#MessageFooter').addClass('information');
						loadPopUp('JoinRouteWindow', 800);
						//GoogleMaps Karte laden. Der Funktion wird das Array mit den Orten übergeben.
						loadGoogleMaps(answer.returnMessage.orte_lang);
					}
             },
			error: function(xhr, textStatus, errorThrown) {
				DoOnFailureReturned('Sorry', "Es besteht keine Verbindung zum Server. Bitte versuchen Sie es später erneut."); 
			}
		 });	
	}
	
	/*11.06.2012 Markus: Google Maps Karte laden
	 * Quelle: https://google-developers.appspot.com/maps/documentation/javascript/examples/directions-waypoints?hl=de-DE
	 * */
	function loadGoogleMaps(orte_lang) {
		var directionDisplay;
		var directionsService = new google.maps.DirectionsService();
		var map;

		directionsDisplay = new google.maps.DirectionsRenderer();
		var myOptions = { 
			  zoom: 6,
			  mapTypeId: google.maps.MapTypeId.ROADMAP
		};
	  
		map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
		directionsDisplay.setMap(map);
		
		var start = orte_lang[0].name + " Germany"; //Erste Element = Startpunkt
	    var end = orte_lang[orte_lang.length-1].name; //Letztes Element = Ende
	    var waypts = [];
	    for (var i=1; i<orte_lang.length-1; i++) { //Schleife vom 2. bis zum vorletzten element
	    	waypts.push({
	            location:orte_lang[i].name,
	            stopover:true});
	    }

	    var request = {
	        origin: start, 
	        destination: end,
	        waypoints: waypts,
	        optimizeWaypoints: true,
	        travelMode: google.maps.DirectionsTravelMode.DRIVING
	    };
	    directionsService.route(request, function(response, status) {
			if (status == google.maps.DirectionsStatus.OK) {
				directionsDisplay.setDirections(response);
			} else {
				alert("Die Route kann lieder nicht auf der Karte angezeigt werden");
			}
		});
	}
	
	
	// TODO: Doku
	function Mitfahren() {
		// TODO: Alle Elemente sperren und Sanduhr anzeigen. Dies ist nötig, wenn der Server langsam antwortet
		var tmpid = $('div#Join_ID').text(); 
 		$('div#JoinRouteWindow').hide();
		
 		
		$.ajax({
             type: "POST",
             url: "joinRoute.json",
             cache: false,
             data: {id: tmpid, 
            	    von: $('[name="letztesuche_von"]', 'form#SearchForm').val(),
            	    nach: $('[name="letztesuche_nach"]', 'form#SearchForm').val()},
             success: function(answer){
				//answer ist immer ein Objekt vom Typ AJAXMessages. Siehe Servlet
            	//Rückgabewert von joinRoute ist immer eine Nachricht, die als PopUp angezeigt werden soll
				DoOnFailureReturned(answer.returnCode, answer.returnMessage);
             },
			error: function(xhr, textStatus, errorThrown) { 
				DoOnFailureReturned('Sorry', "Es besteht keine Verbindung zum Server. Bitte versuchen Sie es später erneut."); 
			}
		});
		
	}
	

//---------------------------------------------------------------------------------------
//  Abschnitt G  |  Funktionen zum anzeigen alle Fahrten und Mitfahrten eines Users 
//---------------------------------------------------------------------------------------

	function loadMeineFahrten(){
		
		$('div#main_meineFahrten div.zeile').each(function() {   //= Schleife über alle Div-Elemente mit class=zeile
			if ($(this).attr('id') != 'zeile_meinefahrten_blanko' 
				&& $(this).attr('id') != 'zeile_meinefahrten_headline') //Blanko-Zeile und Überschrift dürfen nicht gelöscht werden
			{
				$(this).remove();
			}
		});
		
		
		
	    $.ajax({
	        type: "POST",
	        url: "showRoutenUser.json",
	        cache: false,
	        success: function(answer){
				//answer ist immer ein Objekt vom Typ AJAXMessages. Siehe Servlet
					        	
				if (!answer.isOk){
					DoOnFailureReturned(answer.returnCode, answer.returnMessage); 
				} else {
					var meinArray = answer.returnMessage;
					
					$("div#zeile_meinefahrten_blanko").hide();
										
					for(var eintrag in meinArray){
						var neueZeile =$("div#zeile_meinefahrten_blanko").clone();
						neueZeile.show();	
						neueZeile.attr('id',"mf_"+meinArray[eintrag].id);
						$("div#main_meineFahrten").append(neueZeile);
						
						$('div#mf_'+meinArray[eintrag].id+' div.col1').text(meinArray[eintrag].zeit);
						$('div#mf_'+meinArray[eintrag].id+' div.col2').text(meinArray[eintrag].fahrer);
						$('div#mf_'+meinArray[eintrag].id+' div.col3').text(meinArray[eintrag].platz);
						$('div#mf_'+meinArray[eintrag].id+' div.col5').text("n/a");
						
						
						var orte = meinArray[eintrag].orte_lang;
						var test="";
						for(var i in orte){
							if (i==0){
								test = test+orte[i].name;
							} else {
								test = test+', '+orte[i].name;
							}
						}
						$('div#mf_'+meinArray[eintrag].id+' div.col4').text(test);
					}
				}
	        },
	        
			error: function(xhr, textStatus, errorThrown) {
				DoOnFailureReturned('Sorry', "Es besteht keine Verbindung zum Server. Bitte versuchen Sie es später erneut."); 
			},
	        
	        complete: function(jqXHR, textStatus) {
	        	divsAnordnen();
	        }
		    
			
		});
	}
	
	

	
	
	
	
	
	
